/* global vant */
// 样式
import './js/app-common.scss';
/**
 * app端特有方法:
 * 		cmpWrap			在cmp.ready以后,执行cmp相关方法
 * 		BackEvent		封装了m3和微协同的返回传值
 *		loading			加载提示框
 *		service			请求服务器
 *		getImgsPromise	根据文件id获取图片的链接
 *		page			打开页面
 */
import utils from './js/utils';
const {cmp}=window;
let isCmpReady=false;
let cmpTasks=[];
/**
 * 在cmp.ready以后,执行cmp相关方法
 * 返回Promise,接收的值是传入的callback方法返回值
 * 注意: callback方法也能返回Promise
 * @param callback 执行的方法(在cmp.ready以后调用)
 * @param result 没有cmp时的备用返回值
 * @param fnResult 没有cmp时的备用返回值(方法的返回值)
 */
function cmpWrap(callback,result,fnResult){
	if(cmp){
		if(isCmpReady){
			return Promise.resolve(callback(cmp));
		}else{
			return new Promise(function(resolve){
				cmpTasks.push(function(cmpw){
					resolve(callback(cmpw));
				});
			});
		}
	}else{
		console.log('不存在cmp!');
		if(fnResult){
			return Promise.resolve(fnResult());
		}else{
			return Promise.resolve(result);
		}
	}
}
utils.cmpWrap=cmpWrap;
if(cmp){
	cmp.ready(function(){
		isCmpReady=true;
		for(let i=0;i<cmpTasks.length;++i){
			cmpTasks[i](cmp);
		}
		cmpTasks=[];
	});
}
let BackEventListener;
const BackEvent={
	data:{},
	goBack(backCount=1,backParam){
		cmpWrap(function(cmpw){
			if(cmpw.platform.CMPShell){
				// 子页面,m3多webview传值(发送到所有的webview)
				cmpw.webViewListener.fire({
					type:'lexmis_webview_back',
					data:backParam
				});
			}else{
				// 子页面,微协同单页面传值(存到缓存)
				utils.storageSet('lexmis_webview_back_data',backParam);
			}
			// 执行返回操作
			cmpw.href.back(backCount);
		});
	},
	get listen(){
		return BackEventListener;
	},
	// 微协同父页面,如果缓存中有值,则执行监听方法
	set listen(val){
		BackEventListener=val;
		cmpWrap(function(cmpw){
			if(!cmpw.platform.CMPShell){
				const data=utils.storageGet('lexmis_webview_back_data');
				utils.storageDel('lexmis_webview_back_data');
				if(data){
					val(data);
				}
			}
		});
	}
};
utils.BackEvent=BackEvent;
cmpWrap(function(cmpw){
	cmpw.backbutton();
	// cmpw.backbutton.push(BackEvent.goBack);
	if(cmpw.platform.CMPShell){
		// 接收来自其他webview传值(包括自身)
		cmpw.webViewListener.addEvent('lexmis_webview_back',function(data){
			BackEvent.data=utils.extend({},data);
		});
		// m3父页面,监听到子页面的返回
		document.addEventListener('com.seeyon.m3.phone.webBaseVC.didAppear',function(e){
			if(e.data.type==='back'){
				// 父页面执行监听方法
				typeof BackEvent.listen==='function'&&BackEvent.listen(BackEvent.data);
				cmpWrap(function(cmpw){
					cmpw.webViewListener.fire({
						type:'lexmis_webview_back',
						data:{}
					});
				});
			}
		});
	}
},undefined);
let loadCount=0;
/**
 * 加载提示框(打开关闭必须成对出现,保证在第一次打开时打开,最后一次关闭时关闭)
 * @param show 传false表示关闭,不传或者传字符串表示显示
 */
function loading(show){
	function closeLoading(){
		if(!(--loadCount)){
			vant.Toast.clear();
		}else if(loadCount<0){
			loadCount=0;
		}
	}
	if(show!==false){
		// 只在第一次提示
		if(!loadCount++){
			vant.Toast.loading({
				message:show&&show!==true?show:'加载中...',
				forbidClick:true,
				duration:0
			});
		}
	}else{
		closeLoading();
	}
}
utils.loading=loading;
// 构建用于请求的axios
const myAxios=cmpWrap(
	function(cmpw){
		return utils.axios.create({
			method:'post',
			baseURL:cmpw.seeyonbasepath+'/rest/',
			headers:{
				token:cmpw.token
			},
			timeout:180000
		});
	},
	utils.axios.create({
		method:'post',
		baseURL:'/seeyon/rest/',
		timeout:180000
	})
);
/**
 * @callback ServiceCallback
 * @param result {Object} 返回数据
 */
/**
 * 请求服务器
 * @param url {String} 请求路径
 * @param data {Object} 请求参数
 * @param callback {ServiceCallback} 回调方法
 * @param config {Object} 请求配置
 * @param noLoadingTip {Boolean} 是否不显示加载中
 * @return {Promise}
 */
function service(url,data,callback,config,noLoadingTip){
	if(!noLoadingTip){
		loading();
	}
	if(data.params==null){
		data.params={};
	}
	let req=myAxios.then(function(axios){
		return axios.request(
			Object.assign({
				url,
				data
			},config)
		);
	});
	if(callback){
		req=req.then(function(response){
			const result=response.data.result;
			if(result){
				callback(result);
			}else{
				vant.Dialog.alert({message:response.data.retMsg});
			}
			return response;
		});
	}
	return req.then(function(response){
		return response.data;
	}).catch(function(e){
		if(e.response){
			vant.Dialog.alert({
				title:'HTTP请求失败',
				message:e.response.status+'，'+JSON.stringify(e.response.data)
			});
		}else if(e.request){
			vant.Dialog.alert({
				title:'HTTP请求失败',
				message:'请求已发送，未响应！'
			});
		}else{
			vant.Dialog.alert({
				title:'HTTP请求失败',
				message:'请求异常！'+e.message
			});
		}
		throw e;
	}).finally(function(){
		if(!noLoadingTip){
			loading(false);
		}
	});
}
utils.service=service;
/**
 * 根据多个文件id获取图片的链接
 * 返回Promise,接收的值是图片的链接
 * @param fileIds {String[]} 多个文件id
 */
function getImgsPromise(fileIds){
	return cmpWrap(function(cmpw){
		return cmpw.seeyonbasepath;
	},location.origin).then(function(base){
		return fileIds.map(function(fileId){
			return base+'/fileUpload.do?method=showRTE&type=image&fileId='+fileId;
		});
	});
}
/**
 * 根据文件id获取图片的链接
 * @param {String} fileId 文件id
 */
utils.getImgsPromise=getImgsPromise;
/**
 * 打开页面
 * @param {String} url 页面路径
 * @param {Object} data 传递参数
 * @param {Boolean} newWebView 是否新开WebView
 */
function page(url,data,newWebView=true){
	cmpWrap(function(cmpw){
		cmpw.href.next(url,data,{
			openWebViewCatch:newWebView,
			nativeBanner:false
		});
	});
}
utils.page=page;
if(/iPhone/i.test(navigator.userAgent)){
	if(/iPhonex/i.test(navigator.userAgent)){
		document.body.style.paddingTop='44px';
	}else{
		document.body.style.paddingTop='30px';
	}
}
window.utils=utils;
export default utils;
